package cn.tedu.lbs.basic.web.service;

import cn.tedu.lbs.basic.web.repository.TagLibRepository;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tarena.lbs.pojo.basic.po.TagLibraryPO;
import com.tarena.lbs.pojo.basic.vo.TagLibraryVO;
import com.tarena.lbs.pojo.basic.vo.TagVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@Slf4j
public class TagService {
    @Autowired
    private TagLibRepository tagLibRepository;
    //后续使用的用户标签 组织逻辑和文章标签完全一样,区别就在于业务条件tagType=1|0
    public Map<String, List<TagVO>> tagMaps(Integer tagType) {
        //当前要读取的标签数据 是文章标签 条件查询 存在tagType=0
        //如果我们读取的用户标签 tagType=1
        //使用数据层查询 直接查询所有数据list(包含一级 二级) 在业务代码将数据解析转化
        List<TagLibraryPO> allTags=getAllTags(tagType);
        return assembleTagVos(allTags);
    }

    private Map<String, List<TagVO>> assembleTagVos(List<TagLibraryPO> allTags) {
        Map<String,List<TagVO>> mapVO=new HashMap<>();
        //1.map需要 一级标签的名字 做key 二级标签vo列表做value 先拿到一级标签集合
        //一级标签特点是tag_parent_id=0
        List<TagLibraryPO> firstLevelPos=allTags
                .stream().filter(po->po.getTagParentId().equals(0))
                .collect(Collectors.toList());
        //2.循环遍历一级标签 每次遍历 都能获取一级标签名称 从而map的key就有了
        //每次循环一级标签 还能拿到一级标签的id 从allTags拿到二级标签的list
        //同时将二级标签的list pos转化成list tagVos
        for (TagLibraryPO firstLevelPo : firstLevelPos) {
            //每次循环做3件事 一 拿一级标签名称 二 筛选当前一级标签下级列表 三 pos tagVos
            String keyName=firstLevelPo.getTagName();
            Integer firstId=firstLevelPo.getId();
            List<TagLibraryPO> secondLevelPos = allTags.stream().filter(po -> po.getTagParentId().equals(firstId)).collect(Collectors.toList());
            //最后调整 pos转化 获得value值
            List<TagVO> vos=secondLevelPos.stream().map(po->{
                TagVO vo=new TagVO();
                vo.setTagCategoryName(keyName);
                TagLibraryVO libVo=new TagLibraryVO();
                BeanUtils.copyProperties(po,libVo);
                vo.setTagLibraryBO(libVo);
                return vo;
            }).collect(Collectors.toList());
            //将键值对 翻到map中
            mapVO.put(keyName,vos);
        }
        return mapVO;
    }

    private List<TagLibraryPO> getAllTags(Integer tagType){
        //select * from lbs_tag_library where tag_type=0
        QueryWrapper<TagLibraryPO> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("tag_type",tagType);
        return tagLibRepository.list(queryWrapper);
    }
}
